package com.bbcare.cp.plat.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.bbcare.comm.AppException;
import com.bbcare.comm.ErrorCode;
import com.bbcare.cp.plat.entity.cp.ContentTempl;
import com.bbcare.cp.plat.entity.cp.ContentTemplVersion;
import com.bbcare.cp.plat.service.IContTemplService;
import com.bbcare.cp.plat.store.ibatis.cp.IContentTemplDAO;

/**
 * @name: 问卷或其他模板通用接口实现（通用接口独立出来）
 * @author: DemonLee
 * @createTime: 2018.4.23
 * @description: 问卷模板等相关的操作
 * @modify:
 * 
 */
@Service
public class CpContTemplServiceImpl implements IContTemplService {
    private final Log logger = LogFactory.getLog(CpContTemplServiceImpl.class);

    @Autowired
    private IContentTemplDAO contentTemplDao;

    // 根据模板id及类型查询内容模板接口实现
    @Override
    public Map<String, Object> queryContTempl(Map<String, Object> mapIn) throws Exception {
        logger.debug("---queryContTempl---argMap==" + mapIn);
        Map<String, Object> outMap = new HashMap<String, Object>();
        Map<String, Object> argMap = new HashMap<String, Object>(mapIn);
        // 以下3个入参一般不会同时存在，有templVersionId，则不一定有tmplId、templVersion
        String templVersionId = (String) argMap.get("templVersionId");
        String tmplId = (String) argMap.get("tmplId");
        Integer templVersion = (Integer) argMap.get("templVersion");

        // step1: 查询内容版本
        List<ContentTemplVersion> ctvList = null;
        Map<String, Object> contVerMap = new HashMap<String, Object>();
        if (StringUtils.isNotBlank(templVersionId)) {
            contVerMap.put("id", templVersionId);
            ctvList = contentTemplDao.selectContentTemplById(contVerMap);
        } else {
            contVerMap.put("templId", tmplId);
            contVerMap.put("templVersion", templVersion);
            ctvList = contentTemplDao.selectContentDataByTempl(contVerMap);
        }
        if (CollectionUtils.isEmpty(ctvList)) {
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLVERSION_NOT_EXIST,
                    "内容模板版本记录不存在，请核实配置信息！");
        }
        ContentTemplVersion ctv = ctvList.get(0);
        String templDataStr = ctv.getTemplData();
        if (StringUtils.isBlank(templDataStr)) {
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_IS_NULL, "内容模板为空字符串，请核实配置信息！");
        }
        tmplId = ctv.getTemplId();

        // step2: 核实内容模板配置
        contVerMap.clear();
        contVerMap.put("id", tmplId);
        List<ContentTempl> ctList = contentTemplDao.selectTemplById(contVerMap);
        if (CollectionUtils.isEmpty(ctList)) {
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPL_NOT_EXIST, "内容模板记录不存在，请核实配置信息！");
        }
        ContentTempl ctVo = ctList.get(0);

        // step3: 校验内容格式
        // 数据库默认配置为json数组格式
        JSONArray templJsonArray = null;
        try {
            templJsonArray = JSON.parseArray(templDataStr);
            outMap.put("templData", templJsonArray);
        } catch (JSONException arex) {
            logger.error("任务内容模板格式配置错误，非json数组格式： " + arex.getMessage());
            // 非json数组格式，则按json格式再解析
            JSONObject templJsonObject = null;
            try {
                templJsonObject = JSON.parseObject(templDataStr);
                outMap.put("templData", templJsonObject);
            } catch (JSONException exobj) {
                exobj.printStackTrace();
                // 后续重写异常类
                throw (new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_CONFIG_IRREGULAR,
                        "问卷模板配置错误，非json格式！"));
            }
        } catch (AppException appex) {
            throw (appex);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_CONFIG_IRREGULAR,
                    "问卷模板格式解析错误：" + ex.getMessage());
        }
        outMap.put("tmplId", tmplId);
        outMap.put("tmplName", ctVo.getTemplName());
        outMap.put("tmplType", ctVo.getTemplType());
        outMap.put("templVersionId", ctv.getId());
        outMap.put("templVersion", ctv.getTemplVersion());

        return outMap;
    }

    @Override
    // 根据模板id及类型问卷模板接口实现（不含内容）
    public Map<String, Object> queryContTemplNoText(Map<String, Object> mapIn) throws Exception {
        logger.debug("---queryContTempl---argMap==" + mapIn);
        Map<String, Object> outMap = new HashMap<String, Object>();
        Map<String, Object> argMap = new HashMap<String, Object>(mapIn);
        // 以下3个入参一般不会同时存在，有templVersionId，则不一定有tmplId、templVersion
        String templVersionId = (String) argMap.get("templVersionId");
        String tmplId = (String) argMap.get("tmplId");
        Integer templVersion = (Integer) argMap.get("templVersion");

        // step1: 查询内容版本
        List<ContentTemplVersion> ctvList = null;
        Map<String, Object> contVerMap = new HashMap<String, Object>();
        if (StringUtils.isNotBlank(templVersionId)) {
            contVerMap.put("id", templVersionId);
            ctvList = contentTemplDao.selectContentTemplNoTextById(contVerMap);
        } else {
            contVerMap.put("templId", tmplId);
            contVerMap.put("templVersion", templVersion);
            ctvList = contentTemplDao.selectContentDataNoTextByTempl(contVerMap);
        }
        if (CollectionUtils.isEmpty(ctvList)) {
            // 是否抛异常，业务调用侧判断，这里不报错
            return null;
        }
        ContentTemplVersion ctv = ctvList.get(0);
        tmplId = ctv.getTemplId();

        // step2: 核实内容模板配置
        contVerMap.clear();
        contVerMap.put("id", tmplId);
        List<ContentTempl> ctList = contentTemplDao.selectTemplById(contVerMap);
        if (CollectionUtils.isEmpty(ctList)) {
            // 是否抛异常，业务调用侧判断，这里不报错
            return null;
        }

        outMap.put("ContentTempl", ctList.get(0));
        outMap.put("ContentTemplVersion", ctv);

        return outMap;
    }

    // 根据模板id查询内容模板接口实现
    @Override
    public Map<String, Object> queryContTemplDataService(Map<String, Object> mapIn) throws Exception {
        logger.debug("---queryContTempl---argMap==" + mapIn);
        Map<String, Object> outMap = new HashMap<String, Object>();
        Map<String, Object> argMap = new HashMap<String, Object>(mapIn);
        String tmplId = (String) argMap.get("tmplId");
        // 版本号可能为空
        Integer templVersion = (Integer) argMap.get("templVersion");

        // step1: 核实内容模板配置
        Map<String, Object> contVerMap = new HashMap<String, Object>();
        contVerMap.put("id", tmplId);
        List<ContentTempl> ctList = contentTemplDao.selectTemplById(contVerMap);
        if (CollectionUtils.isEmpty(ctList)) {
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPL_NOT_EXIST, "内容模板记录不存在，请核实配置信息！");
        }
        ContentTempl ctVo = ctList.get(0);
        if (null == templVersion) {
            // 版本为空，则使用最新版本
            templVersion = ctVo.getNewVersion();
        }

        // step2: 查询内容版本
        contVerMap.clear();
        List<ContentTemplVersion> ctvList = null;
        contVerMap.put("templId", tmplId);
        contVerMap.put("templVersion", templVersion);
        ctvList = contentTemplDao.selectContentDataByTempl(contVerMap);
        if (CollectionUtils.isEmpty(ctvList)) {
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLVERSION_NOT_EXIST,
                    "内容模板版本记录不存在，请核实配置信息！");
        }
        ContentTemplVersion ctv = ctvList.get(0);
        String templDataStr = ctv.getTemplData();
        if (StringUtils.isBlank(templDataStr)) {
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_IS_NULL, "内容模板为空字符串，请核实配置信息！");
        }
        tmplId = ctv.getTemplId();

        // step3: 校验内容格式
        // 数据库默认配置为json数组格式
        JSONArray templJsonArray = null;
        try {
            templJsonArray = JSON.parseArray(templDataStr);
            outMap.put("templData", templJsonArray);
        } catch (JSONException arex) {
            logger.error("任务内容模板格式配置错误，非json数组格式： " + arex.getMessage());
            // 非json数组格式，则按json格式再解析
            JSONObject templJsonObject = null;
            try {
                templJsonObject = JSON.parseObject(templDataStr);
                outMap.put("templData", templJsonObject);
            } catch (JSONException exobj) {
                exobj.printStackTrace();
                // 后续重写异常类
                throw (new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_CONFIG_IRREGULAR,
                        "问卷模板配置错误，非json格式！"));
            }
        } catch (AppException appex) {
            throw (appex);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_CONFIG_IRREGULAR,
                    "问卷模板格式解析错误：" + ex.getMessage());
        }
        outMap.put("tmplId", tmplId);
        outMap.put("tmplName", ctVo.getTemplName());
        outMap.put("tmplType", ctVo.getTemplType());
        outMap.put("templVersionId", ctv.getId());
        outMap.put("templVersion", ctv.getTemplVersion());

        return outMap;
    }
    /**
     * 自我记录 根据任务ID关联去查询模板
    * @author fangxm 
    * @date 2018年6月8日 
     */
	@Override
	public List<Map<String, Object>> selectContentDataByTemplVersionId(Map<String, Object> mapIn) throws Exception {
        logger.debug("---selectContentDataByTemplVersionId---argMap==" + mapIn);
        Map<String, Object> outMap = new HashMap<String, Object>();
        Map<String, Object> argMap = new HashMap<String, Object>(mapIn);
        List<Map<String, Object>> list = new ArrayList<>();
        String ptTaskId = (String) argMap.get("ptTaskId");
        // step1: 核实内容模板配置
        Map<String, Object> contVerMap = new HashMap<String, Object>();
        // step2: 根据任务关联  任务内容模板版本配置表  查询模板
        List<ContentTemplVersion> ctvList = null;
        contVerMap.put("ptTaskId", ptTaskId);
        ctvList = contentTemplDao.selectContentDataByTemplVersionId(contVerMap);
        if (CollectionUtils.isEmpty(ctvList)) {
            throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLVERSION_NOT_EXIST,"任务内容模板版本不存在，请核实配置信息！");
		} else {
			for (int i = 0; i < ctvList.size(); i++) {
				ContentTemplVersion ctv = ctvList.get(i);
				String tmplId = ctv.getTemplId();
				// step3 去找一下内容模板配置
				contVerMap.clear();
				contVerMap.put("id", tmplId);
				List<ContentTempl> ctList = contentTemplDao.selectTemplById(contVerMap);
				if (CollectionUtils.isEmpty(ctList)) {
					throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPL_NOT_EXIST,"任务内容模板不存在，请核实配置信息！");
				}
				ContentTempl ctVo = ctList.get(0);
				String templDataStr = ctv.getTemplData();
				if (StringUtils.isBlank(templDataStr)) {
					throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_IS_NULL,"内容模板为空字符串，请核实配置信息！");
				}
				// step3: 校验内容格式
				// 数据库默认配置为json数组格式
				JSONArray templJsonArray = null;
				try {
					templJsonArray = JSON.parseArray(templDataStr);
					outMap.put("templData", templJsonArray);
				} catch (JSONException arex) {
					logger.error("任务内容模板格式配置错误，非json数组格式： " + arex.getMessage());
					// 非json数组格式，则按json格式再解析
					JSONObject templJsonObject = null;
					try {
						templJsonObject = JSON.parseObject(templDataStr);
						outMap.put("templData", templJsonObject);
					} catch (JSONException exobj) {
						exobj.printStackTrace();
						// 后续重写异常类
						throw (new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_CONFIG_IRREGULAR,
								"问卷模板配置错误，非json格式！"));
					}
				} catch (AppException appex) {
					throw (appex);
				} catch (Exception ex) {
					ex.printStackTrace();
					throw new AppException(ErrorCode.FOLLOWUP_EXCEPTION_TYPE_QUES_TEMPLDATA_CONFIG_IRREGULAR,
							"问卷模板格式解析错误：" + ex.getMessage());
				}
				outMap.put("tmplId", tmplId);
				outMap.put("tmplName", ctVo.getTemplName());
				outMap.put("tmplType", ctVo.getTemplType());
				outMap.put("templVersionId", ctv.getId());
				outMap.put("templVersion", ctv.getTemplVersion());
				list.add(outMap);
			}
		}
        return list;
	}
}
